package com.summer.data.jql.concept;

import com.summer.data.Jsql;
import com.summer.data.dialect.Dialect;
import com.summer.data.jql.Context;
import com.summer.data.jql.behavior.GroupAble;
import com.summer.data.jql.behavior.OrderAble;
import com.summer.data.jql.behavior.SelectAble;
import com.summer.data.jql.concept.alias.FieldAlias;
import com.summer.data.jql.concept.exp.OrderExp;

/**
 * @author 345480567@qq.com
 */

public interface Field<T> extends SelectAble, GroupAble, OrderAble {

    default FieldAlias alias(String aliasName) {
        return new FieldAlias(this, aliasName);
    }

    default OrderExp asc() {
        return new OrderExp(this);
    }

    default OrderExp desc() {
        return new OrderExp(this, OrderExp.ORDER_TYPE.DESC);
    }

    Jsql toFieldSql(Context ctx, Dialect dialect);

    @Override
    default Jsql toGroupSql(Context ctx, Dialect dialect) {
        return toFieldSql(ctx, dialect);
    }

    @Override
    default Jsql toSelectJsql(Context ctx, Dialect dialect) {
        return toFieldSql(ctx, dialect);
    }

    @Override
    default Jsql toOrderSql(Context ctx, Dialect dialect) {
        return toFieldSql(ctx, dialect);
    }

}
